package com.ailsa.learningsystem.dao.impl;

import com.ailsa.learningsystem.dao.UsersDao;
import com.ailsa.learningsystem.pojo.Users;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;

/**
 * @Author 冉冉
 * @Version 1.0
 * 在类中写辅助的方法：一般这个为私有的方法
 * 1.private修饰属性叫做私有属性
 * 2.private修饰方法叫做私有方法，不允许其他的类进行调用
 */

public class UsersDaoImpl implements UsersDao {
    /**
     *注册的功能：添加或者增加
     * @param users
     * 用户名是唯一的
     */
    @Override
    public void register(Users users) {
        Boolean flag=false;//设置标记
        //调用获取全部的用户的信息
        List<Users> list = getAllUsers();
        //循环遍历
        for (Users users1:list) {
            //判断用户是否已存在，如果存在，将不能再注册
            if(users1.getUsername().equals(users.getUsername())){
                flag=true;
                break;
            }
        }
        if(!flag){
            //首先将用户的信息添加到集合
            list.add(users);
            //再次将集合添加到文件中
            saveList(list);
            System.out.println("恭喜：：："+users.getUsername()+"注册成功");

        }else {
            System.out.println("对不起，用户已经被注册");
        }
    }
    /**
     * 根据用户名和密码以及角色进行登录，判断用户名和密码是否正确，如果正确登录成功
     * 将用户名和密码以及角色封装在Users对象中，所以参数可以直接使用Users
     */
    @Override
    public boolean login(Users users) {
        Boolean flag=false;//设置标记
        //调用获取查询用户的信息的方法
        List<Users> list = getAllUsers();
        for (Users users1:list) {
            if(users1.getUsername().equals(users.getUsername())&&users1.getPassword().equals(users.getPassword())){
                flag=true;
                break;
            }
        }
        return flag;
    }

    /**
     * 查询所有用户信息的方法：从user.bat文件中查询到用户信息
     * @return
     */
    @Override
    public List<Users> getAllUsers() {
        //声明对象流输入流
        ObjectInputStream ois=null;
        List<Users> list=null;
        try{
            //创建的对象流
            ois=new ObjectInputStream(new FileInputStream("user.bat"));
            //读取数据
            list=(List<Users>)ois.readObject();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                ois.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }
        return list;
    }

    /**
     * 将所有的用户信息存储到文件,涉及到了IO，需要进行序列化和反序列化,将所有的用户信息存储到user.bat
     * @param list
     * ObjectOutputStream:对象流输出流
     * FileOutputStream：字节流
     */
    private void saveList(List<Users> list){
        //声明流的对象
        ObjectOutputStream oos=null;
        //异常的快捷键：ALT+Enter【回车键】
       try{
           //使用序列化，通过字节流获取到文件内容转换为对象流
           oos=new ObjectOutputStream(new FileOutputStream("user.bat"));
           //将用户信息写入到文件
           oos.writeObject(list);
       }catch (Exception e){
            e.printStackTrace();
       }finally {
           try{
               oos.close();
           }catch (Exception e){
               e.printStackTrace();
           }
       }
    }
}
